草庐IT

C++ 对和指针

全部标签

c++ - 为什么我们可以将取消引用的指针递增到 C++ 中的常量数据?

令我惊讶的是,C++允许递增指向常量数据的解引用指针,而它不应该允许通过指向常量数据的指针。考虑代码:#include#includeusingnamespacestd;intmain(){intx=2;constint*xPtr2=&x;*xPtr2++;cout但是x的值仍然是2。这意味着*xPtr2实际上并没有增加。我也试过*xPtr2=3,但是这次显示编译错误。为什么会这样? 最佳答案 此处++的优先级高于*。因此*xPtr2++相当于*(xPtr2++)由于xPtr2不是常量指针而是指向常量数据的指针,因此在这种情况下递增

c++ - g++ 和 clang++ - 删除重载转换运算符歧义获取的指针

我试图发布此代码作为对thisquestion的回答,通过制作这个指针包装器(替换原始指针)。这个想法是将const委托(delegate)给它的指针,这样filter函数就不能修改值。#include#includetemplateclassmy_pointer{T*ptr_;public:my_pointer(T*ptr=nullptr):ptr_(ptr){}operatorT*&(){returnptr_;}operatorTconst*()const{returnptr_;}};std::vector>filter(std::vector>const&vec){//*vec.

c++ - 带有指针参数的函数模板重载决策

以下代码演示了我一直用来确定类型T是否为C++模板元编程模式的核心。是特定类模板的实例化:#includetemplatestructS{};templateconstexprboolisS(constS*){returntrue;}templateconstexprboolisS(constT*){returnfalse;}intmain(){Ss;std::cout它有两个重载constexpr功能模板isS,它输出1,正如预期的那样。如果我从第二个isS中删除指针,即将其替换为templateconstexprboolisS(constT){returnfalse;}程序意外输出

c++:push_back() 和 back() 与指针的行为

我有两个C++列表,std::listList1和std::listList2;.现在,我想多次执行以下操作:List1.push_back(new_object);List2.push_back(&List1.back());我的问题:List2中的引用在每一步之后是否仍然有效?即:List2中的第一个元素是否仍然引用List1中的第一个元素等? 最佳答案 是的,它仍然有效。std::list插入不会使迭代器(或在这种情况下指向内容的指针)无效。 关于c++:push_back()和b

c++ - 如何获取指向引用成员的指针?

考虑这段代码:structAA{int&rr;};有没有办法获取指向AA::rr的指针(或者可能是引用)以获取此信息?AA*aa;automm=&AA::rr;//error:cannotcreatepointertoreferencemember‘AA::rr’aa->*mm;同样在gcc-7.0.1decltype(AA::mm)中只是int&。这符合标准吗?这有意义吗?编辑对不起各位,我提出的问题不太好。没有人提示引用不是对象或者没有指向引用的指针这样的东西。目标是相当自私的。给定structAA{int&rr;};我只想拥有这样的功能:templatevoidtest(Memb

c++ - 是否不可能将对 const 指针的引用返回到 const 数据?

我在尝试将reference返回到指向const数据的const指针时遇到了一些问题。在以下代码中,get_pC返回对指向数据的const指针的引用:#includeusingnamespacestd;classC{public:doublec;};classA{public:C*pC;A(constdoubleval):pC(newC){pC->c=val;};};classB{public:constA*pA;B(constA&a):pA(&a){};C*const&get_pC()const{returnpA->pC;}};intmain(){Aa(3.7);Bb(a);C*co

c++ - 函数指针的赋值(effective c++ item 35)

这个问题在这里已经有了答案:functionpointerassignmentandcallinc++?(2个答案)关闭4年前。在effectivec++,item35中,作者通过函数指针引入了策略模式。具体在第172页classGameCharacter;intdefaultHealthCalc(constGameCharacter&gc);classGameCharacter{public:typedefint(*HealthCalcFunc)(constGameCharacter&);explicitGameCharacter(HealthCalcFunchcf=defaultH

c++ - 将指针转换为容器类型中的 const

C++提供从T*的隐式转换至constT*.如果我使用T*现在在容器类中,如vector,那么当然没有隐式转换为vector不再。使用reinterpret_cast似乎可以类型转换整个容器,但这样做真的安全吗?templateconstvector&constVector(constvector&vec){returnreinterpret_cast&>(vec);}//Usage:vectorvec1;vectorvec2=constVector(vec1); 最佳答案 butisitactuallysafetodothis?不

c++ - 重载决策中的 const 指针

GCC将这两个函数声明视为等价的:voidF(int*a){}voidF(int*consta){}test.cpp:Infunction'voidF(int*)':test.cpp:235:error:redefinitionof'voidF(int*)'test.cpp:234:error:'voidF(int*)'previouslydefinedhere这是有道理的,因为在这种情况下,调用者将始终忽略常量...它只会影响函数内部参数“a”的使用。我想知道的是,标准在哪里(如果有的话)表示可以丢弃用作函数参数的指针上的限定符以实现重载解析。(我真正的问题是,我想弄清楚GCC在哪里

c++ - 是否可以使用 const_cast 覆盖我的 const C++ 成员函数,返回一个指向内部非常量数组的 const 指针?

我正在学习C++并遇到了这个const_cast运算符。考虑以下示例:classTest{private:charname[100];public:Test(constchar*n){std::strncpy(name,n,99);name[99]=0;}constchar*getName()const{returnname;}}现在用户可以做Testt("hi");const_cast(t.getName())[0]='z';//modifiesprivatedata...这样好吗?我的意思是修改私有(private)数据,因为returnconstchar*的目的是防止更改私有(p